package com.joker.rxweather.ui.animation;

import android.annotation.TargetApi;
import android.os.Build;
import android.view.View;
import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.animation.ObjectAnimator;
import com.nineoldandroids.util.FloatProperty;
import java.lang.ref.WeakReference;

import static android.os.Build.VERSION.SDK_INT;
import static android.os.Build.VERSION_CODES.LOLLIPOP;

public class ViewAnimationUtils {

  private final static boolean LOLLIPOP_PLUS = SDK_INT >= LOLLIPOP;

  public static final int SCALE_UP_DURATION = 500;

  private static FloatProperty<RevealAnimator> floatProperty =
      new FloatProperty<RevealAnimator>("revealRadius") {
        @Override public void setValue(RevealAnimator object, float value) {
          object.setRevealRadius(value);
        }

        @Override public Float get(RevealAnimator object) {
          return object.getRevealRadius();
        }
      };

  /**
   * Returns an Animator which can animate a clipping circle.
   * <p>
   * Any shadow cast by the View will respect the circular clip from this animator.
   * <p>
   * Only a single non-rectangular clip can be applied on a View at any time.
   * Views clipped by a circular reveal animation take priority over
   * {@link View#setClipToOutline(boolean) View Outline clipping}.
   * <p>
   * Note that the animation returned here is a one-shot animation. It cannot
   * be re-used, and once started it cannot be paused or resumed.
   *
   * @param view The View will be clipped to the animating circle.
   * @param centerX The x coordinate of the center of the animating circle.
   * @param centerY The y coordinate of the center of the animating circle.
   * @param startRadius The starting radius of the animating circle.
   * @param endRadius The ending radius of the animating circle.
   */
  @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static SupportAnimator createCircularReveal(
      View view, int centerX, int centerY, float startRadius, float endRadius) {

    if (!(view.getParent() instanceof RevealAnimator)) {
      throw new IllegalArgumentException(
          "View must be inside RevealFrameLayout or RevealLinearLayout.");
    }

    RevealAnimator revealLayout = (RevealAnimator) view.getParent();
    revealLayout.initRevealInfo(
        new RevealAnimator.RevealInfo(centerX, centerY, startRadius, endRadius,
            new WeakReference<>(view)));

    if (LOLLIPOP_PLUS) {
      return new SupportAnimatorLollipop(
          android.view.ViewAnimationUtils.createCircularReveal(view, centerX, centerY, startRadius,
              endRadius), revealLayout);
    }

    ObjectAnimator revealAnimator =
        ObjectAnimator.ofFloat(revealLayout, floatProperty, startRadius, endRadius);
    revealAnimator.addListener(getRevealFinishListener(revealLayout));

    return new SupportAnimatorPreL(revealAnimator, revealLayout);
  }

  private static Animator.AnimatorListener getRevealFinishListener(RevealAnimator target) {
    if (SDK_INT >= 18) {
      return new RevealAnimator.RevealFinishedJellyBeanMr2(target);
    } else if (SDK_INT >= 14) {
      return new RevealAnimator.RevealFinishedIceCreamSandwich(target);
    } else {
      return new RevealAnimator.RevealFinishedGingerbread(target);
    }
  }

  static class SimpleAnimationListener implements Animator.AnimatorListener {

    @Override public void onAnimationStart(Animator animation) {

    }

    @Override public void onAnimationEnd(Animator animation) {

    }

    @Override public void onAnimationCancel(Animator animation) {

    }

    @Override public void onAnimationRepeat(Animator animation) {

    }
  }
}
